﻿#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//数组名的理解
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0] = %p\n", &arr[0]);
//	printf("arr  = %p\n", arr);   //这个没有取地址的数组为数组首元素的地址
//		return 0;
//} 



//绝大部分情况下，认为其数组名为首元素的地址
//但这里就有所不同


//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%d\n", sizeof(arr)); //但这里是40个字节， 是个例外
//	return 0;
//}

//• 其实数组名就是数组⾸元素(第⼀个元素)的地址是对的，但是有两个例外：
//sizeof(数组名)，sizeof中单独放数组名，这⾥的数组名表⽰整个数组，计算的是整个数组的⼤⼩，
//单位是字节
//•
//& 数组名，这⾥的数组名表⽰整个数组，取出的是整个数组的地址（整个数组的地址和数组⾸元素
//的地址是有区别的）
 // 下面有另一个例子
  
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0]     = %p\n", &arr[0]);
//	printf("&arr[0]  + 1= %p\n", &arr[0] + 1);
//	printf("arr         = %p\n", arr);
//	printf("arr      + 1= %p\n", arr + 1);
//	printf("&arr        = %p\n", &arr);  //整个数组的地址
//	printf("&arr    + 1 = %p\n", &arr + 1);  //整个数组的地址, 跳过了整个数组，它的类型是int*[10]
//	return 0; //这里忘记return 0；会自动插入
//}


//通过指针来访问数组

//首先先用下标来访问数组
//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i <= sz - 1; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	for (i = 0; i <= sz - 1; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}



//用指针访问数组并打印

//int main()
//{
//	int arr[10] = { 0 };
////输⼊
//int i = 0;
//int sz = sizeof(arr) / sizeof(arr[0]);
////输⼊
//
//int* p = arr;
//for (i = 0; i < sz; i++)
//{
//	scanf("%d", p + i);    //scanf("%d", arr+i);//也可以这样写
//
//}
////输出
//for (i = 0; i < sz; i++)
//{
//	printf("%d ", *(p + i));
//}
//return 0;
//}


//数组名就是指针，就是地址，因而可以有下面这种写法,直接用p代替arr     *(p+i)换成p[i]也
//int main()
//{
//	int arr[10] = { 0 };
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//输⼊
//
//		int* p = arr;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p + i);//scanf("%d", arr+i);//也可以这样写
//
//	}
//	//输出
//
//		for (i = 0; i < sz; i++)
//		{
//			printf("%d ", p[i]);
//		}
//	return 0;
//}


//因而，数组下标的访问实际上也是编译器处理，通过指针运算的


//下面有个更厉害的想法
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//输⼊


	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
		printf("%d ", *(p + i));
		printf("%d ", *(i + arr));
		printf("%d ", i[arr]);
	}
	//[]是下标引用操作符，i，arr是操作数 ====>  arr[i] and i[arr] 实际上是相同的
	return 0;
}
